(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        //AMD
        define(factory);
    } else if (typeof exports === 'object') {
        //Node, CommonJS之类的
        module.exports = factory();
    } else {
        //浏览器全局变量(root 即 window)
        root.resLoader = factory(root);
    }
}(this, function () {
    var isFunc = function(f){
        return typeof f === 'function';
    }
    //构造器函数
    function resLoader(config){
        this.option = {
            resourceType : 'image', //资源类型，默认为图片
            baseUrl : './', //基准url
            resources : [], //资源路径数组
            onStart : null, //加载开始回调函数，传入参数total
            onProgress : null, //正在加载回调函数，传入参数currentIndex, total
            onComplete : null, //加载完毕回调函数，传入参数total
            videoResource : [], //视频加载资源路径
        }
        if(config){
            for(i in config){
                this.option[i] = config[i];
            }
        }
        else{
            alert('参数错误！');
            return;
        }
        this.status = 0; //加载器的状态，0：未启动   1：正在加载   2：加载完毕
        this.total = (this.option.resources.length+this.option.videoResource.length) || 0; //资源总数
        this.currentIndex = 0; //当前正在加载的资源索引
    };


    // resLoader.prototype.videoPre = function () {
    //   // var _this = this;
    //
    //
    // }

    resLoader.prototype.start = function(){
        this.status = 1;
        var _this = this;
        var baseUrl = this.option.baseUrl;
        for(var i=0,l=this.option.resources.length; i<l; i++){
            var r = this.option.resources[i], url = '';
            if(r.indexOf('http://')===0 || r.indexOf('https://')===0){
                url = r;
            }
            else{
                url = baseUrl + r;
            }

            var image = new Image();
            image.onload = function(){_this.loaded();};
            image.onerror = function(){_this.loaded();};
            image.src = url;
        }
      function preVideo(src) {
        var req = new XMLHttpRequest();
        req.open('GET', src.src, true);
        req.responseType = 'blob';
        req.onload = function() {
          // Onload is triggered even on 404
          // so we need to check the status code
          if (this.status === 200) {
            var videoBlob = this.response;
            // console.log(videoBlob)
            var vid = URL.createObjectURL(videoBlob); // IE10+
            // Video is now downloaded
            // and we can set it as source on the video element
            // video.src = vid;
            videoTestSrc[src.id] = vid
            // console.log(vid)
            _this.loaded()
            // _this.option.onProgress(++_this.currentIndex, _this.total);
          }
          // console.log('aaaaaaaaaaaaaaaaaaaaaaaaaaa')
        }
        req.onerror = function() {
          // Error
          preVideo(src)
        }
        req.send();
      }
      for (var j =0 ; j< this.option.videoResource.length; j++){
        preVideo(this.option.videoResource[j])
      }
      if(isFunc(this.option.onStart)){
        this.option.onStart(this.total);
      }
    }

    resLoader.prototype.loaded = function(){
        if(isFunc(this.option.onProgress)){
            this.option.onProgress(++this.currentIndex, this.total);
        }
        //加载完毕
        if(this.currentIndex===this.total){
            if(isFunc(this.option.onComplete)){
                this.option.onComplete(this.total);
            }
        }
    }

    //暴露公共方法
    return resLoader;
}));
